/*
 * Created on 12.12.2003
 */
package vitalsFacade;

import observations.*;

/**
 <code>MeasurementAttribute</code> Can hold information about anything that
 * can be measured.
 
 @author Sascha Hemminger
 @version 2004-09-10
 */
class MeasurementAttribute implements FacadeAttribute {

  protected VitalsFacade facade;

  private PhenomenonType phenomenonType;

  private Unit updateUnit;

  protected String value;

  MeasurementAttribute(VitalsFacade facade, PhenomenonType phenomenonType,
      Unit updateUnit) {

    this.facade = facade;
    this.phenomenonType = phenomenonType;
    this.updateUnit = updateUnit;

  }

  protected boolean isNumeric(String value) {
    for (int i = 0; i < value.length(); ++i) {
      char eachChar = value.charAt(i);
      if (Character.isDigit(eachChar))
        continue;
      if ((i == 0&& (eachChar == '-'))
        continue;
      if (eachChar == '.')
        continue;
      return false;
    }
    return true;
  }

  /**
   @see vitalsFacade.FacadeAttribute#load()
   */
  public void load() {
    value = facade.getSubject().getLatestAmountOf(phenomenonType)
        .getAmountString();
  }

  String name() {
    return facade.getSubject().getPhenomenonOf(phenomenonType).getName();
  }

  /**
   @see vitalsFacade.FacadeAttribute#save()
   */
  public void save() {

    if (value == null)
      return;
    try {
      new Measurement(new Quantity(value, updateUnit), phenomenonType,
          facade.getSubject(), facade.getDate());
    catch (OutOfRangeException e) {
      value = null;
      return;
    }

  }

  String value() {
    return value;
  }

  void value(String newValue) {
    value = (isNumeric(newValue? newValue : null);
  }

}